// ignore_for_file: deprecated_member_use_from_same_package

import 'package:dartkit/dartkit.dart';
import 'package:postgres/postgres.dart';
import 'package:test/test.dart';

/// 由于不同测试文件是并行的，而这里会涉及到数据库的读写操作，在数据库为单例的情况下，唯一的选择是将所有测试组织在同一个文件中
/// 以目前我的水平来说，这是没办法的事情
void main() {
  prepareAndCleanPostgres("test_database_for_table");

  test("获取表格信息测试", () async {
    // 一开始数据库为空，此时创建1个表格
    List list1 = await argConn.value.tablesAll;
    await argConn.value.execute(
        "CREATE TABLE IF NOT EXISTS table_test (id SERIAL PRIMARY KEY);");
    await argConn.value.execute(
        "CREATE TABLE IF NOT EXISTS table_test2 (id SERIAL PRIMARY KEY);");
    await argConn.value.execute(
        "CREATE TABLE IF NOT EXISTS table_test3 (id SERIAL PRIMARY KEY);");
    // 可以读取到表格的数量变为1
    List list2 = await argConn.value.tablesAll;
    expect(list2.length - list1.length, equals(3));
    // 删除这个表格，表格的数量下降1
    await argConn.value.tableDelete("table_test");
    List list3 = await argConn.value.tablesAll;
    expect(list2.length - list3.length, equals(1));
  });

  /// 由于我看不到postgresql的数据库，因此需要这个方法测试是否插入成功
  test("基础读写测试", () async {
    await argConn.value.execute("""
      CREATE TABLE IF NOT EXISTS test_table (
        id SERIAL PRIMARY KEY,
        name TEXT
      )
""");

    // 插入一条数据
    await argConn.value.execute(
      Sql.named('INSERT INTO test_table (id, name) VALUES (@id, @name)'),
      parameters: {
        'id': 1,
        'name': '测试数据',
      },
    );

    // 查询插入的数据
    final result = await argConn.value.execute(
        Sql.named('SELECT name FROM test_table WHERE id = @id'),
        parameters: {
          'id': 1,
        });

    // 断言查询结果
    expect(result, isNotEmpty);
    expect(result.first[0], equals('测试数据'));
  });
}
